`timescale 1ns/1ps
`default_nettype none

module soc_top (
    input  wire clk,
    input  wire rstn,

    // 可选：导出监视信号给 TB（如果在 cpu_top 里加了）
    output wire [31:0] mon_addr,
    output wire [31:0] mon_wdata,
    output wire [3:0]  mon_we,

    // 可选：GPIO 演示
    output wire [7:0]  gpio_out
);

    // ---------------- CPU <-> Master ----------------
    wire        m_req_valid, m_req_ready, m_req_we;
    wire [31:0] m_req_addr, m_req_wdata, m_rsp_rdata;
    wire [3:0]  m_req_be;
    wire        m_rsp_valid, m_rsp_err;

    cpu_top u_cpu (
        .clk  (clk),
        .rstn (rstn),

        // ---- TinyBus Master ----
        .m_req_valid(m_req_valid),
        .m_req_addr (m_req_addr),
        .m_req_wdata(m_req_wdata),
        .m_req_be   (m_req_be),
        .m_req_we   (m_req_we),
        .m_req_ready(m_req_ready),
        .m_rsp_valid(m_rsp_valid),
        .m_rsp_rdata(m_rsp_rdata),
        .m_rsp_err  (m_rsp_err),

        // 若在 cpu_top 暴露了监视端口，则连到顶层便于 TB 抓
        .mon_addr   (mon_addr),
        .mon_wdata  (mon_wdata),
        .mon_we     (mon_we)
    );

    // ---------------- 1x2 互连 ----------------
    // S0: DMEM 64KB -> 0x0000_0000 ~ 0x0000_FFFF（含 tohost=0x0000_4000）
    // S1: GPIO 4KB  -> 0x4000_0000 ~ 0x4000_0FFF
    wire        s0_req_valid, s0_req_ready, s0_req_we;
    wire [31:0] s0_req_addr, s0_req_wdata, s0_rsp_rdata;
    wire [3:0]  s0_req_be;
    wire        s0_rsp_valid, s0_rsp_err;

    wire        s1_req_valid, s1_req_ready, s1_req_we;
    wire [31:0] s1_req_addr, s1_req_wdata, s1_rsp_rdata;
    wire [3:0]  s1_req_be;
    wire        s1_rsp_valid, s1_rsp_err;

    tinybus_1x2 #(
        .SLV0_BASE(32'h0000_0000), .SLV0_MASK(32'h0000_FFFF),
        .SLV1_BASE(32'h4000_0000), .SLV1_MASK(32'h0000_0FFF)
    ) u_xbar (
        .clk(clk),
        .rstn(rstn),

        // ---- Master ----
        .m_req_valid(m_req_valid),
        .m_req_addr (m_req_addr),
        .m_req_wdata(m_req_wdata),
        .m_req_be   (m_req_be),
        .m_req_we   (m_req_we),
        .m_req_ready(m_req_ready),
        .m_rsp_valid(m_rsp_valid),
        .m_rsp_rdata(m_rsp_rdata),
        .m_rsp_err  (m_rsp_err),

        // ---- Slave0 : DMEM ----
        .s0_req_valid(s0_req_valid),
        .s0_req_addr (s0_req_addr),
        .s0_req_wdata(s0_req_wdata),
        .s0_req_be   (s0_req_be),
        .s0_req_we   (s0_req_we),
        .s0_req_ready(s0_req_ready),
        .s0_rsp_valid(s0_rsp_valid),
        .s0_rsp_rdata(s0_rsp_rdata),
        .s0_rsp_err  (s0_rsp_err),

        // ---- Slave1 : GPIO ----
        .s1_req_valid(s1_req_valid),
        .s1_req_addr (s1_req_addr),
        .s1_req_wdata(s1_req_wdata),
        .s1_req_be   (s1_req_be),
        .s1_req_we   (s1_req_we),
        .s1_req_ready(s1_req_ready),
        .s1_rsp_valid(s1_rsp_valid),
        .s1_rsp_rdata(s1_rsp_rdata),
        .s1_rsp_err  (s1_rsp_err)
    );

    // ---------------- 从机 0：DMEM ----------------
    tinybus_dmem_slave #(
        .DEPTH_BYTES(64*1024)
    ) u_dmem (
        .clk      (clk),
        .rstn     (rstn),
        .req_valid(s0_req_valid),
        .req_addr (s0_req_addr),
        .req_wdata(s0_req_wdata),
        .req_be   (s0_req_be),
        .req_we   (s0_req_we),
        .req_ready(s0_req_ready),
        .rsp_valid(s0_rsp_valid),
        .rsp_rdata(s0_rsp_rdata),
        .rsp_err  (s0_rsp_err)
    );

    // ---------------- 从机 1：GPIO（演示） ----------------
    tinybus_gpio_slave #(
        .REG_NUM(4)
    ) u_gpio (
        .clk      (clk),
        .rstn     (rstn),
        .req_valid(s1_req_valid),
        .req_addr (s1_req_addr),
        .req_wdata(s1_req_wdata),
        .req_be   (s1_req_be),
        .req_we   (s1_req_we),
        .req_ready(s1_req_ready),
        .rsp_valid(s1_rsp_valid),
        .rsp_rdata(s1_rsp_rdata),
        .rsp_err  (s1_rsp_err),
        .gpio_out (gpio_out)
    );

endmodule

`default_nettype wire
